﻿#region Header
// Copyright 2007-2011, Jerónimo Milea
// 
// This file is part of NetJsWire.
// 
//     NetJsWire is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as published by
//     the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
// 
//     NetJsWire is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
// 
//     You should have received a copy of the GNU General Public License
//     along with NetJsWire.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using NetJsWire.Lite.Editors;
using NetJsWire.Lite.Widgets.UI.Grid;
using Newtonsoft.Json;

namespace NetJsWire.Lite.Designers
{
    public class GridPanelDesigner : ContainerDesigner, ITypeDescriptorContext, IWindowsFormsEditorService
    {
        private DesignerVerbCollection m_Verbs;
        // DesignerVerbCollection is overridden from ComponentDesigner
        public override DesignerVerbCollection Verbs
        {
            get
            {
                if ( m_Verbs == null )
                {
                    // Create and initialize the collection of verbs
                    m_Verbs = new DesignerVerbCollection();

                    m_Verbs.Add( new DesignerVerb( "Get javascript", OnGetJavascript ) );
                    m_Verbs.Add( new DesignerVerb( "Edit columns", OnEditColumns ) );
                }
                return m_Verbs;
            }
        }

        private void OnEditColumns( object sender, EventArgs e )
        {
            var c = new ColumnCollectionEditor( typeof( ColumnCollection ) );
            c.EditValue( this, this, ( ( GridPanel ) Component ).ColumnModel.Columns );
        }

        protected override object GetService(Type serviceType)
        {
            if ( serviceType == typeof( IWindowsFormsEditorService ) )
            {
                return this;
            }

            return base.GetService( serviceType );
        }

        /// <summary>
        /// Cierra el área de control desplegable abierta.
        /// </summary>
        public void CloseDropDown()
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Muestra el control especificado en un área desplegable bajo un campo de valor de la cuadrícula de propiedades que proporciona este servicio.
        /// </summary>
        /// <param name="control"><see cref="T:System.Windows.Forms.Control"/> de lista desplegable que se va a abrir. </param>
        public void DropDownControl( Control control )
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Muestra el <see cref="T:System.Windows.Forms.Form"/> especificado.
        /// </summary>
        /// <returns>
        /// <see cref="T:System.Windows.Forms.DialogResult"/> que indica el código de resultado que devuelve el <see cref="T:System.Windows.Forms.Form"/>.
        /// </returns>
        /// <param name="dialog"><see cref="T:System.Windows.Forms.Form"/> que se va a mostrar. </param>
        public DialogResult ShowDialog( Form dialog )
        {
            var service = Component.Site.GetService( typeof( IUIService ) ) as IUIService;
            if ( service != null )
            {
                return service.ShowDialog( dialog );
            }
            return dialog.ShowDialog( Component as IWin32Window );
        }

        #region Implementation of ITypeDescriptorContext

        object IServiceProvider.GetService( Type serviceType )
        {
            if ( serviceType == typeof( IWindowsFormsEditorService ) )
            {
                return this;
            }

            return base.GetService( serviceType );
        }

        /// <summary>
        /// Provoca el evento <see cref="E:System.ComponentModel.Design.IComponentChangeService.ComponentChanging"/>.
        /// </summary>
        /// <returns>
        /// true si se puede cambiar este objeto; en caso contrario, false.
        /// </returns>
        public bool OnComponentChanging()
        {
            return true;
        }

        /// <summary>
        /// Provoca el evento <see cref="E:System.ComponentModel.Design.IComponentChangeService.ComponentChanged"/>.
        /// </summary>
        public void OnComponentChanged()
        {

        }

        /// <summary>
        /// Obtiene el contenedor que representa esta solicitud <see cref="T:System.ComponentModel.TypeDescriptor"/>.
        /// </summary>
        /// <returns>
        /// Interfaz <see cref="T:System.ComponentModel.IContainer"/> con el conjunto de objetos de este objeto <see cref="T:System.ComponentModel.TypeDescriptor"/>; de lo contrario, null, si no hay ningún contenedor o si el objeto <see cref="T:System.ComponentModel.TypeDescriptor"/> no utiliza objetos externos.
        /// </returns>
        public IContainer Container
        {
            get { return Component.Site.Container; }
        }

        /// <summary>
        /// Obtiene el objeto que se conecta a esta solicitud del descriptor de tipos.
        /// </summary>
        /// <returns>
        /// Objeto que invoca al método en el objeto <see cref="T:System.ComponentModel.TypeDescriptor"/>; de lo contrario, null, si no hay ningún objeto responsable de la llamada.
        /// </returns>
        public object Instance
        {
            get { return Component; }
        }

        /// <summary>
        /// Obtiene el objeto <see cref="T:System.ComponentModel.PropertyDescriptor"/> que está asociado al elemento de contexto especificado.
        /// </summary>
        /// <returns>
        /// Objeto <see cref="T:System.ComponentModel.PropertyDescriptor"/> que describe el elemento de contexto especificado; de lo contrario, null si no hay un objeto <see cref="T:System.ComponentModel.PropertyDescriptor"/> responsable de la llamada.
        /// </returns>
        public PropertyDescriptor PropertyDescriptor
        {
            get { return null; }
        }

        #endregion
    }
}
